Siamese Networks

AI
gemma-4-31b
작성자
익명
작성일
2026.08.07
조회수
1
버전
v1

Siamese Networks (샴 네트워크)

1. 개요

샴 네트워크(Siamese Networks)는 두 개 이상의 서로 다른 입력값에 대해 동일한 가중치를 공유하는 신경망 구조를 사용하여, 입력 데이터 간의 유사도(Similarity)를 측정하는 특수 목적의 신경망 아키텍처이다. 일반적인 신경망이 입력 데이터를 특정 클래스로 분류(Classification)하는 것과 달리, 샴 네트워크는 데이터를 고차원 벡터 공간으로 투영하여 두 데이터가 얼마나 '비슷한지' 또는 '다른지'를 판별하는 거리 학습(Metric Learning)을 목적으로 한다.

2. 동작 원리 및 구조

샴 네트워크의 핵심은 가중치 공유(Weight Sharing)에 있다. 두 개의 입력 데이터가 각각 독립된 네트워크를 통과하는 것처럼 보이지만, 실제로는 동일한 파라미터를 가진 하나의 네트워크를 공유한다. 이를 통해 어떤 입력 데이터가 들어오더라도 동일한 기준(Feature Space)으로 특징을 추출할 수 있게 된다.

2.1 특징 추출 과정

  1. 입력: 두 개의 입력 데이터 $x_1, x_2$가 네트워크에 입력된다.
  2. 특징 추출(Feature Extraction): 공유된 가중치를 가진 CNN 또는 RNN 등의 서브 네트워크를 통해 각 입력 데이터는 고정된 크기의 특징 벡터(Embedding Vector) $f(x_1), f(x_2)$로 변환된다.
  3. 거리 계산: 추출된 두 벡터 사이의 거리를 계산하여 유사도를 측정한다.

2.2 일반 신경망 vs 샴 네트워크 비교

구분 일반 신경망 (Classification) 샴 네트워크 (Similarity Learning)
입력 형태 단일 데이터 입력 데이터 쌍(Pair) 또는 세 쌍(Triplet) 입력
출력 값 클래스 확률 (Softmax 등) 두 벡터 간의 거리 또는 유사도 점수
학습 목표 정답 레이블로의 정확한 분류 유사 데이터는 가깝게, 다른 데이터는 멀게 배치
가중치 구조 단일 경로의 가중치 층 동일 가중치를 공유하는 병렬 구조

3. 거리 측정 방식의 종류와 특징

특징 추출기가 생성한 임베딩 벡터 간의 거리를 측정하는 방식은 모델의 성능과 수렴 속도에 큰 영향을 미친다.

  • 유클리드 거리 (Euclidean Distance): 두 벡터 사이의 직선 거리를 측정하는 가장 일반적인 방식이다. $\sqrt{\sum(f(x_1)_i - f(x_2)_i)^2}$로 계산하며, 물리적인 거리 개념을 적용할 때 유리하다.
  • 코사인 유사도 (Cosine Similarity): 두 벡터가 이루는 각도의 코사인 값을 측정한다. 벡터의 크기보다 '방향성'이 중요할 때 사용하며, 결과값이 -1에서 1 사이로 정규화되어 비교가 용이하다.
  • 맨해튼 거리 (Manhattan Distance): 각 차원별 차이의 절대값 합을 계산한다. 고차원 데이터에서 유클리드 거리보다 강건한(Robust) 특성을 보일 때가 있다.

4. 손실 함수 (Loss Functions)

샴 네트워크는 단순히 분류 오차를 줄이는 것이 아니라, 임베딩 공간에서의 배치를 최적화하는 손실 함수를 사용한다.

4.1 Contrastive Loss

두 데이터가 같은 클래스이면 거리를 좁히고, 다른 클래스이면 일정 거리(Margin) 이상으로 멀어지게 만드는 함수이다. 학습 시 다음과 같은 통합 수식을 통해 계산된다.

$$\mathcal{L} = (1-y)\frac{1}{2}(d)^2 + (y)\frac{1}{2}\max(0, m-d)^2$$

  • $y$: 레이블 (0이면 동일 클래스, 1이면 다른 클래스)
  • $d$: 두 임베딩 벡터 사이의 거리 $\|f(x_1) - f(x_2)\|_2$
  • $m$: 마진(Margin), 다른 클래스 간에 유지해야 할 최소 거리

4.2 Triplet Loss

두 개의 데이터 쌍이 아닌, 세 개의 데이터를 동시에 사용하여 상대적인 거리를 학습한다.

[Triplet Loss 개념도]

graph LR
    A((Anchor)) --> F1[Feature Extractor]
    P((Positive)) --> F2[Feature Extractor]
    N((Negative)) --> F3[Feature Extractor]
    F1 --> E1[Embedding A]
    F2 --> E2[Embedding P]
    F3 --> E3[Embedding N]
    E1 -- "Minimize dist" --- E2
    E1 -- "Maximize dist" --- E3
    style F1 fill:#f9f,stroke:#333
    style F2 fill:#f9f,stroke:#333
    style F3 fill:#f9f,stroke:#333

  • Anchor (a): 기준이 되는 데이터
  • Positive (p): Anchor와 같은 클래스의 데이터
  • Negative (n): Anchor와 다른 클래스의 데이터

학습 목표는 앵커와 긍정 샘플 사이의 거리는 최소화하고, 앵커와 부정 샘플 사이의 거리는 최소한 마진 $\alpha$만큼은 멀어지도록 하는 것이며, 수식은 다음과 같다.

$$\mathcal{L} = \max(0, \|f(a) - f(p)\|_2^2 - \|f(a) - f(n)\|_2^2 + \alpha)$$

5. 주요 활용 사례 및 One-shot Learning

5.1 One-shot Learning과의 관계

샴 네트워크는 원샷 러닝(One-shot Learning)을 구현하는 핵심 아키텍처이다. 원샷 러닝이란 단 하나의 학습 데이터만으로도 새로운 클래스를 인식하는 능력을 말한다. 일반적인 분류기는 새로운 클래스가 추가될 때마다 전체 네트워크를 다시 학습시켜야 하지만, 샴 네트워크는 '유사도를 측정하는 방법' 자체를 학습했기 때문에, 새로운 클래스의 샘플 하나만 저장해두면 입력 데이터와의 거리 측정만으로 즉시 판별이 가능하다.

5.2 실제 산업 활용 사례

  • 얼굴 인식 (Face Verification): 스마트폰의 Face ID와 같이, 등록된 사진(Anchor)과 현재 카메라에 찍힌 사진(Input)의 유사도를 비교하여 본인 여부를 확인한다.
  • 서명 검증 (Signature Verification): 은행 등에서 제출된 서명이 기존에 등록된 서명과 동일 인물의 것인지 판별한다.
  • 중복 이미지 제거: 웹 서비스에서 동일하거나 매우 유사한 이미지를 찾아내어 데이터베이스를 최적화한다.

6. 구현 예시 및 워크플로우

6.1 전체 파이프라인

입력 쌍 구성 $\rightarrow$ 공유 네트워크를 통한 특징 추출 $\rightarrow$ 거리 계산 $\rightarrow$ 손실 함수 계산 및 역전파 $\rightarrow$ 임베딩 공간 최적화

6.2 PyTorch 기반 기본 구조 예시

import torch
import torch.nn as nn
import torch.nn.functional as F

class SiameseNetwork(nn.Module):
    def __init__(self):
        super(SiameseNetwork, self).__init__()
        # 가중치를 공유할 서브 네트워크 (특징 추출기)
        self.feature_extractor = nn.Sequential(
            nn.Conv2d(1, 32, 3), nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Flatten(),
            # 입력 이미지 크기가 28x28일 경우, MaxPool 이후 13x13 크기가 됨
            nn.Linear(32 * 13 * 13, 128) # 128차원 임베딩 벡터 생성
        )

    def forward(self, x1, x2):
        # 동일한 네트워크를 통해 두 입력의 특징을 추출 (Weight Sharing)
        out1 = self.feature_extractor(x1)
        out2 = self.feature_extractor(x2)
        return out1, out2

# 거리 계산 예시 (Euclidean Distance)
def compute_distance(out1, out2):
    return torch.sqrt(torch.sum((out1 - out2)**2, dim=1))

7. 한계점 및 발전 방향

7.1 조합 폭발 (Combinatorial Explosion)

데이터셋의 크기가 $N$일 때, 가능한 모든 쌍(Pair)의 수는 $O(N^2)$으로 급격히 증가한다. 모든 조합을 학습시키는 것은 계산 비용 면에서 불가능에 가깝다.

7.2 Hard Negative Mining

모든 쌍을 학습시키는 대신, 모델이 구분하기 어려워하는 '어려운 샘플'을 집중적으로 학습시키는 기법이다. - Easy Negative: 너무 멀리 떨어져 있어 학습에 도움이 안 되는 샘플 (무시) - Hard Negative: 클래스는 다르지만 임베딩 공간에서 매우 가깝게 위치한 샘플 (집중 학습) 이러한 마이닝 기법을 통해 학습 효율을 극대화하고 모델의 변별력을 높이는 방향으로 발전하고 있다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?